// symbol 补充  


// 每次创建的symbol都是唯一的值
// console.log(
//     Symbol() === Symbol()
// )

// symbol for方法可以全局寻找或创建一个symbol
// 全局可使用  
// const s1 = Symbol.for('foo')
// const s2 = Symbol.for('foo')
// console.log(s1 === s2)  

// Symbol传入的参数一定是字符串，如果不是字符串，也会被转化成字符串
// console.log(
//     Symbol.for(true) === Symbol.for('true')
// )  

// 对象的Symbol.iterator属性，指向该对象的默认遍历器方法。
// console.log(Symbol.iterator)
// 对象的Symbol.hasInstance属性，指向一个内部方法。当其他对象使用instanceof运算符，判断是否为该对象的实例时，会调用这个方法。
// console.log(Symbol.hasInstance)

// 对象的Symbol.toStringTag属性，指向一个方法
// 这个属性可以用来定制[object Object]或[object Array]中object后面的那个字符串。
// const obj = {
//     [Symbol.toStringTag]: 'A',
// }
// console.log(obj.toString()) // [object aObject]  


// 通过symbol定义的对象属性名
// 无法通过 for ... in 及 Object.keys() 方法拿到
// JSON.stringify()序列化对象时也无法获取到
const obj ={
    [Symbol('a')]: 'a',
    'foo': 'foo'
}

for(let key in obj){
    console.log(key) //foo
}

console.log(Object.keys(obj)) // [ 'foo' ]
console.log(JSON.stringify(obj))  // {"foo":"foo"}  

// 可以通过属性的 Object.getOwnPropertySymbols()方法获取到所有的 Symbol属性
console.log(Object.getOwnPropertySymbols(obj)) // [ Symbol(a) ]